package main

import "fmt"

// 定义链表节点
type CircularListNode struct {
	Val  int               //链表的数据域
	Next *CircularListNode //链表的指针域
}

// 添加操作：给循环链表追加节点
func (cl *CircularListNode) Append(val int) {
	if cl == nil {
		return
	}
	cur := cl
	//1. 移动指针变量到末尾节点
	for cur.Next != cl {
		cur = cur.Next
	}
	//2. 新节点追加到末尾节点
	newNode := &CircularListNode{Val: val}
	cur.Next = newNode
	newNode.Next = cl //更改末尾节点的指向
}

// 打印循环链表
func (cl *CircularListNode) Print() {
	if cl == nil {
		return
	}
	cur := cl.Next
	if cur == cl { //只有一个节点的情况
		fmt.Println(cur.Val)
		return
	}

	//1. 打印头节点
	fmt.Printf("%d\t", cl.Val)
	//2. 遍历打印下一个节点
	for cur != cl {
		fmt.Printf("%d\t", cur.Val)
		cur = cur.Next
	}
	fmt.Println()
}

// 删除操作：删除循环链表的末尾节点
func (cl *CircularListNode) Delete() {
	// cli为空 或者 只有1个节点
	if cl == nil || cl == cl.Next {
		return
	}
	//1. 找到链表的倒数第2个节点
	cur := cl
	for cur.Next.Next != cl {
		cur = cur.Next
	}
	//2. 删除最后节点
	cur.Next = cl
}
func main() {
	//1. 一个节点组成的循环链表
	head := &CircularListNode{Val: 1}
	head.Next = head

	//2. 添加节点
	newNode := &CircularListNode{Val: 2}
	head.Next = newNode
	newNode.Next = head

	tmp := &CircularListNode{Val: 3}
	head.Next.Next = tmp
	tmp.Next = head

	//3.删除节点
	head.Next.Next = head

	fmt.Println("#################  方法封装  #####################")
	//4. 追加链表节点
	root := &CircularListNode{Val: 11}
	root.Next = root //构成循环链表
	root.Append(12)
	root.Append(13)
	root.Append(14)
	root.Append(15)
	root.Append(16)

	//5. 打印链表节点
	root.Print()

	//6. 删除链表节点
	root.Delete()
	root.Print()

	root.Delete()
	root.Print()
}
